package com.ziytek.web.citizen.mapper;

import com.ziytek.web.citizen.model.vo.RealTimeDo;
import com.ziytek.web.citizen.model.vo.StatsDo;
import org.apache.ibatis.annotations.*;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;

/**
 * @author fengh
 */
@Mapper
public interface TableMapper {

    /**
     * 动态创建表
     *
     * @param tableName 表名
     * @param createSql 创建表的SQL语句
     */
    @Update("CREATE TABLE IF NOT EXISTS " +
            " `${tableName}` ( ${createSql})")
    void createTable(@Param("tableName") String tableName, @Param("createSql") String createSql);


    /**
     * 动态创建表索引(唯一索引)
     *
     * @param tableName 表名
     * @param indexName 索引名称
     * @param columns   索引字段
     */
    @Delete("CREATE UNIQUE INDEX IF NOT EXISTS `${indexName}` " +
            "ON `${tableName}` (${columns});")
    void createUniqueIndex(@Param("tableName") String tableName, @Param("indexName") String indexName, @Param("columns") String columns);

    /**
     * 动态创建表索引
     *
     * @param tableName 表名
     * @param indexName 索引名称
     * @param columns   索引字段
     */
    @Delete("CREATE INDEX IF NOT EXISTS `${indexName}` " +
            "ON `${tableName}` (${columns});")
    void createIndex(@Param("tableName") String tableName, @Param("indexName") String indexName, @Param("columns") String columns);


    /**
     * 动态删除表索引
     *
     * @param indexName 索引名称
     */
    @Delete("DROP INDEX IF EXISTS ${indexName}")
    void dropIndex(@Param("indexName") String indexName);

    /**
     * 新增实时数据
     *
     * @param tableName 表名
     * @param columns   表字段
     * @param dataList  数据列表
     * @return int
     */
    @Insert({
            "<script>",
            "INSERT INTO ${tableName} ",
            "<foreach item='col' collection='columns' open='(' separator=',' close=')'>",
            "${col}",
            "</foreach>",
            "VALUES ",
            "<foreach item='row' collection='dataList' separator=','>",
            "<foreach item='val' collection='row.values' open='(' separator=',' close=')'>",
            "#{val}",
            "</foreach>",
            "</foreach>",
            "</script>"
    })
    int addRealTime(@Param("tableName") String tableName,
                    @Param("columns") Set<String> columns,
                    @Param("dataList") Set<LinkedHashMap<String, Object>> dataList);


    /**
     * 新增实时数据
     *
     * @param tableName 表名
     * @param vo        新增数据对象
     * @return int
     */
    @Insert({"INSERT INTO ${tableName} (cabinetNo, boardNo, channelNo, data, createTime,time,batchNo) VALUES " +
            " (#{vo.cn}, #{vo.bn}, #{vo.cnn}, #{vo.data}, #{vo.createTime},#{vo.time},#{vo.batchNo})"
    })
    int addSingleRealTime(@Param("tableName") String tableName, @Param("vo") RealTimeDo vo);


    /**
     * 删除实时数据
     *
     * @param tableName 表名
     * @param id        id
     */
    void deleteSingleRealTime(@Param("tableName") String tableName, @Param("id") Long id);

    /**
     * 新增实时数据
     *
     * @param tableName 表名
     * @param vo        新增数据对象
     * @return int
     */
    @Insert({"INSERT INTO ${tableName} (cabinetNo, boardNo, channelNo, data, createTime,time,operateId,batchNo) VALUES " +
            " (#{vo.cn}, #{vo.bn}, #{vo.cnn}, #{vo.data}, #{vo.createTime},#{vo.time},#{vo.operateId},#{vo.batchNo})"
    })
    int addSingleStats(@Param("tableName") String tableName, @Param("vo") StatsDo vo);

    /**
     * 查询实时数据总数
     *
     * @param tableName  表名
     * @param cabinetNo  机柜号
     * @param boardNo    板号
     * @param channelNo  通道号
     * @param createTime 创建时间
     * @return int 总数
     */
    int queryRealTimeCount(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("boardNo") int boardNo, @Param("channelNo") int channelNo, @Param("createTime") long createTime);

    /**
     * 查询实时数据总数
     *
     * @param tableName 表名
     * @param cabinetNo 机柜号
     * @param boardNo   板号
     * @param channelNo 通道号
     * @param batchNo   批次号
     * @return int 总数
     */
    int queryRealTimeCountByBatchNo(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("boardNo") int boardNo, @Param("channelNo") int channelNo, @Param("batchNo") String batchNo);


    /**
     * 查询实时数据总数
     *
     * @param tableName  表名
     * @param cabinetNo  机柜号
     * @param boardNo    板号
     * @param channelNo  通道号
     * @param createTime 创建时间
     * @param at         累计时间
     * @return int 总数
     */
    int queryRealTimeCountByAt(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("boardNo") int boardNo, @Param("channelNo") int channelNo, @Param("createTime") long createTime, @Param("at") Long at);

    /**
     * 查询实时数据总数
     *
     * @param tableName 表名
     * @param cabinetNo 机柜号
     * @param boardNo   板号
     * @param channelNo 通道号
     * @param batchNo   批次号
     * @param at        累计时间
     * @return int 总数
     */
    int queryRealTimeCountByAtAndBatchNo(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("boardNo") int boardNo, @Param("channelNo") int channelNo, @Param("batchNo") String batchNo, @Param("at") Long at);

    /**
     * 查询实时数据
     *
     * @param tableName  表名
     * @param cabinetNo  机柜号
     * @param boardNo    板号
     * @param channelNo  通道号
     * @param createTime 创建时间
     * @param offset     偏移量
     * @param limit      数量
     * @return List<RealTimeDo>
     */
    List<RealTimeDo> queryRealTime(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("boardNo") int boardNo, @Param("channelNo") int channelNo, @Param("createTime") long createTime, @Param("offset") int offset, @Param("limit") int limit);

    /**
     * 查询实时数据
     *
     * @param tableName 表名
     * @param cabinetNo 机柜号
     * @param boardNo   板号
     * @param channelNo 通道号
     * @param batchNo   批次号
     * @param offset    偏移量
     * @param limit     数量
     * @return List<RealTimeDo>
     */
    List<RealTimeDo> queryRealTimeByBatchNoAndLimit(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("boardNo") int boardNo, @Param("channelNo") int channelNo, @Param("batchNo") String batchNo, @Param("offset") int offset, @Param("limit") int limit);


    /**
     * 查询实时数据
     *
     * @param tableName 表名
     * @param cabinetNo 机柜号
     * @param boardNo   板号
     * @param channelNo 通道号
     * @param batchNo   批次号
     * @return List<RealTimeDo>
     */
    List<RealTimeDo> queryRealTimeByBatchNo(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("boardNo") int boardNo, @Param("channelNo") int channelNo, @Param("batchNo") String batchNo);


    /**
     * 查询实时数据
     *
     * @param tableName 表名
     * @param cabinetNo 机柜号
     * @param boardNo   板号
     * @param channelNo 通道号
     * @param batchNo   批次号
     * @param at        累计时间
     * @return List<RealTimeDo>
     */
    List<RealTimeDo> queryRealTimeByAtAndBatchNo(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("boardNo") int boardNo, @Param("channelNo") int channelNo, @Param("batchNo") String batchNo, @Param("at") Long at);

    /**
     * 查询实时数据
     *
     * @param tableName 表名
     * @param cabinetNo 机柜号
     * @param boardNo   板号
     * @param channelNo 通道号
     * @return List<RealTimeDo>
     */
    RealTimeDo queryRealTimeLast(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("boardNo") int boardNo, @Param("channelNo") int channelNo);

    /**
     * 查询实时数据
     *
     * @param tableName 表名
     * @param cabinetNo 机柜号
     * @param boardNo   板号
     * @param channelNo 通道号
     * @param batchNo   批次号
     * @return List<RealTimeDo>
     */
    RealTimeDo queryRealTimeLastAndBatchNo(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("boardNo") int boardNo, @Param("channelNo") int channelNo, @Param("batchNo") String batchNo);

    /**
     * 查询放电容量统计数据
     *
     * @param tableName 表名
     * @param cabinetNo 机柜号
     * @param operateId operateId
     * @param boardNo   板号
     * @param channelNo 通道号
     * @return List<RealTimeDo>
     */
    StatsDo queryStatsDoLast(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("operateId") String operateId, @Param("boardNo") int boardNo, @Param("channelNo") int channelNo);

    /**
     * 查询放电容量统计数据
     *
     * @param tableName 表名
     * @param cabinetNo 机柜号
     * @param boardNo   板号
     * @param channelNo 通道号
     * @return List<RealTimeDo>
     */
    StatsDo queryStatsDoLastNoId(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("boardNo") int boardNo, @Param("channelNo") int channelNo);

    /**
     * 查询放电容量统计数据
     *
     * @param tableName 表名
     * @param cabinetNo 机柜号
     * @param boardNo   板号
     * @param channelNo 通道号
     * @param batchNo   batchNo
     * @return List<RealTimeDo>
     */
    StatsDo queryStatsDoLastByBatchNo(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("boardNo") int boardNo, @Param("channelNo") int channelNo, @Param("batchNo") String batchNo);

    /**
     * 是否有数据
     *
     * @param tableName 表名
     * @param cabinetNo 机柜号
     * @param batchNo   batchNo
     * @return 大于0 有, 否则没有
     */
    Long hasStatsDo(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("batchNo") String batchNo);


    /**
     * 查询放电容量统计数据
     *
     * @param tableName 表名
     * @param cabinetNo 机柜号
     * @param batchNo   batchNo
     * @return List<StatsDo>
     */
    Long queryStatsDoListCount(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("batchNo") String batchNo);

    /**
     * 查询放电容量统计数据
     *
     * @param tableName 表名
     * @param cabinetNo 机柜号
     * @param batchNo   batchNo
     * @param offset    offset
     * @param limit     limit
     * @return List<StatsDo>
     */
    List<StatsDo> queryStatsDoList(@Param("tableName") String tableName, @Param("cabinetNo") int cabinetNo, @Param("batchNo") String batchNo, @Param("offset") int offset, @Param("limit") int limit);

}
